import * as browser from '../../src/browser';
import { should } from 'chai';

describe('browser definitions', () => {
  it('should be able to use noop implementations as decorators', () => {
    class TestModel extends browser.Model {
      // we don't care about the types matching here since at runtime you can pass
      // as many args to a function as you like
      @((browser.AllowNull as any)({ someOption: (browser.DataType as any).STRING } as any))
      @browser.AutoIncrement()
      @browser.Column()
      @browser.Comment()
      @browser.CreatedAt()
      @browser.Default()
      @browser.DefaultScope()
      @browser.DeletedAt()
      @browser.ForeignKey()
      @browser.PrimaryKey()
      @browser.Scopes()
      @browser.Table()
      @browser.Unique()
      @browser.UpdatedAt()
      @browser.BelongsTo()
      @browser.BelongsToMany()
      @browser.HasMany()
      @browser.HasOne()
      @browser.AfterBulkCreate()
      @browser.AfterBulkDelete()
      @browser.AfterBulkDestroy()
      @browser.AfterBulkRestore()
      @browser.AfterBulkSync()
      @browser.AfterBulkUpdate()
      @browser.AfterConnect()
      @browser.AfterCreate()
      @browser.AfterDefine()
      @browser.AfterDelete()
      @browser.AfterDestroy()
      @browser.AfterFind()
      @browser.AfterInit()
      @browser.AfterRestore()
      @browser.AfterSave()
      @browser.AfterSync()
      @browser.AfterUpdate()
      @browser.AfterUpsert()
      @browser.AfterValidate()
      @browser.BeforeBulkCreate()
      @browser.BeforeBulkDelete()
      @browser.BeforeBulkDestroy()
      @browser.BeforeBulkRestore()
      @browser.BeforeBulkSync()
      @browser.BeforeBulkUpdate()
      @browser.BeforeConnect()
      @browser.BeforeCount()
      @browser.BeforeCreate()
      @browser.BeforeDefine()
      @browser.BeforeDelete()
      @browser.BeforeDestroy()
      @browser.BeforeFind()
      @browser.BeforeFindAfterExpandIncludeAll()
      @browser.BeforeFindAfterOptions()
      @browser.BeforeInit()
      @browser.BeforeRestore()
      @browser.BeforeSave()
      @browser.BeforeSync()
      @browser.BeforeUpdate()
      @browser.BeforeUpsert()
      @browser.BeforeValidate()
      @browser.ValidationFailed()
      @browser.Contains()
      @browser.Equals()
      @browser.Is()
      @browser.IsAfter()
      @browser.IsAlpha()
      @browser.IsAlphanumeric()
      @browser.IsArray()
      @browser.IsBefore()
      @browser.IsCreditCard()
      @browser.IsDate()
      @browser.IsDecimal()
      @browser.IsEmail()
      @browser.IsFloat()
      @browser.IsIn()
      @browser.IsInt()
      @browser.IsIP()
      @browser.IsIPv4()
      @browser.IsIPv6()
      @browser.IsLowercase()
      @browser.IsNull()
      @browser.IsNumeric()
      @browser.IsUppercase()
      @browser.IsUrl()
      @browser.IsUUID()
      @browser.Length()
      @browser.Max()
      @browser.Min()
      @browser.Not()
      @browser.NotContains()
      @browser.NotEmpty()
      @browser.NotIn()
      @browser.NotNull()
      @browser.Validate()
      @browser.Validator()
      field: string;
    }

    should().exist(new TestModel());
  });
});
